from DBA.dbmanager import DBInterface
from PerfWifiDAC import PerfWifi
from ListWifiDAC import ListWifi
from ConfigWifiDAC import ConfigWifi

class Mesure:
    """
    Classe d acces aux mesures referencees dans la base
    Table: PR5QTME
    """
    def __init__(self,id=""):
        """
        Constructeur
        @param id identificateur de la mesure: soit on le rentre, soit il sera genere automatiquement.
        """
        self.id            = {"key":"ID","value":id}
        self.description    = {"key":"description","value":""}
        self.xposition        = {"key":"x","value":""}
        self.yposition        = {"key":"y","value":""}
        self.zposition        = {"key":"z","value":""}
        self.time        = {"key":"time","value":""}
        self.ensConfigWifi    = []
        self.ensListWifi    = []
        self.ensPerfWifi    = []
        self.__interfacebase    = DBInterface()
        if not id:
            self.id["value"]    = str(self.__interfacebase.createNewID());
    
    def addConfigWifi(self,config):
        """
        Ajout d'une configuration wifi a une mesure
        @param config objet de type ConfigWifi()
        """
        self.ensConfigWifi.append(config)
    
    def nbConfigWifi(self):
        """
        retourne le nombre de configuration wifi pour cette mesure
        """
        return self.ensConfigWifi.count()

    def addListWifi(self,List):
        """
        Ajout d'une liste de cellule wifi pour la mesure en cours
        @param List objet de type ListWifi()
        """
        self.ensListWifi.append(List)
    
    def nbListWifi(self):
        """
        Retourne le nombre de cellules wifi pour la mesure en cours
        """
        return self.ensListWifi.count()

    def addPerfWifi(self,perf):
        """
        Ajout d'une mesure de performance pour la mesure en  cours
        @param perf Objet de type PerfWifi()
        """
        self.ensPerfWifi.append(perf)
    
    def nbPerf(self):
        """
        Retourne le nombre de performances wifi pour la mesure en cours
        """
        return self.ensPerfWifi.count()

    def createByDico(self,dico):
        """
        Creation d'une mesure depuis un dictionnaire genere en Page7
        @param dico Dictionnaire de mesure        """
        
        self.description["value"]     = dico[self.description["key"]]
        self.xposition["value"]     = dico[self.xposition["key"]]
        self.yposition["value"]     = dico[self.yposition["key"]]
        self.zposition["value"]     = dico[self.zposition["key"]]
        self.time["value"]         = dico[self.time["key"]]

    def insertToDb(self,idCampagne):
        """
        Insertion de la mesure en cours dans la BDD
        @param idCampagne identificateur unique de la campagne en cours
        """
        dico = self.createMesureDico(idCampagne)
        self.__interfacebase.insert(self.__interfacebase.mesuretablename,self.__interfacebase.mesuremapping,dico)
        for config in self.ensConfigWifi:
            config.insertToDb(self.id["value"])
        for liste in self.ensListWifi:
            liste.insertToDb(self.id["value"])
        for perf in self.ensPerfWifi:
            perf.insertToDb(self.id["value"])

    def selectMesureFromDB(self,identificateur):
        """
        Recuperation des mesures relatives a une campagne
        @param identificateur identificateur unique de campagne
        """
        key ={}
        key["link_ca"] = identificateur
        ensMesure = self.__interfacebase.selectTable(self.__interfacebase.mesuretablename,self.__interfacebase.mesuremapping,key)
        return ensMesure


    def updateIntoDb(self,idCampagne):
        """
        Mise a jour d'une mesure relative a une campagne
        @param idCampagne identificateur unique de campagne
        """
        dico = self.createMesureDico(idCampagne)
        self.__interfacebase.update(self.__interfacebase.mesuretablename,self.__interfacebase.mesuremapping,dico)
        for config in self.ensConfigWifi:
            config.updateIntoDb(self.id["value"])
        for liste in self.ensListWifi:
            liste.updateIntoDb(self.id["value"])
        for perf in self.ensPerfWifi:
            perf.updateIntoDb(self.id["value"])

    def deleteFromDb(self):
        """
        Suppression de la mesure courante de la BDD
        """
        key={}
        key["ID"]=self.id["value"]
        #Au cas ou il n'y aurai pas de config wifi (peu probable quand meme)
        elementsuppr=0
        #On commence par recuperer la config Wifi pour la supprimer
        conf = ConfigWifi()
        elementsuppr=elementsuppr+int(conf.deleteFromDb(self.id["value"]))
        #Puis on s'occupe de la listeWifi
        liste = ListWifi()
        elementsuppr=elementsuppr+int(liste.deleteFromDb(self.id["value"]))
        #Ensuite vient les perfs
        perf = PerfWifi()
        elementsuppr=elementsuppr+int(perf.deleteFromDb(self.id["value"]))
        #Suppression de la Mesure
        elementsuppr=elementsuppr + int(self.__interfacebase.deleteFromTable(self.__interfacebase.mesuretablename,self.__interfacebase.mesuremapping,key))
        return elementsuppr

    def createMesureDico(self,idCampagne):
        """
        Creation d'un dictionnaire de la mesure en cours
        @param idCampagne identificateur unique de campagne
        """
        dico ={}
        dico[self.id["key"]]            = self.id["value"]
        dico["link_ca"]                = idCampagne
        
        dico[self.description["key"]]        = self.description["value"]
        dico[self.xposition["key"]]        = self.xposition["value"]
        dico[self.yposition["key"]]        = self.yposition["value"]
        dico[self.zposition["key"]]        = self.zposition["value"]
        dico[self.time["key"]]            = self.time["value"]
        return dico

if __name__=="__main__":
    bat = Batiment()
    bat.name["value"]        = "test";
    bat.description["value"]    = "Description du batiment";
    bat.xposition["value"]        = "34";
    bat.yposition["value"]        = "23";
    bat.zposition["value"]        = "15";
    bat.height["value"]        = "123";
    bat.width["value"]        = "23";
    
    from SalleModule import Salle
    sal = Salle()
    sal.name["value"]        = "salle 1";
    #sal.description["value"]    = "Description";
    sal.xposition["value"]        = "12";
    sal.yposition["value"]        = "12";
    sal.zposition["value"]        = "12";
    sal.height["value"]        = "432";
    sal.width["value"]        = "234";
    bat.addSalle(sal)
    bat.insertToDb();
